package serivce

import (
	"golang.org/x/crypto/bcrypt"
	"guard/internal/app/user/models"
	"guard/internal/errors"
	"guard/internal/tool"
)

// Login 可以用rpc查询用户，也可以自定义提供，因为oauth整体和这个解耦，这个必要的数据就正常返回，解耦的方式是将登录用户加载的另一个结构体里
func (s *userServiceImpl) Login(username, password string) (id int, userName string, err error) {
	// 查询用户
	id, userName, oldPassword, _, _, _, enable, err := s.st.SelUser(username)
	if err != nil {
		return 0, "", errors.OtherError("用户不存在")
	}
	// 是否激活
	if !enable {
		return 0, "", errors.OtherError("用户已被禁用")
	}
	// 校验密码
	err = bcrypt.CompareHashAndPassword([]byte(oldPassword), []byte(password))
	if err != nil {
		return 0, "", errors.OtherError("用户名或密码错误")
	}
	// 返回用户
	return id, userName, nil
}

func (s *userServiceImpl) UserInfo(token string) (userInfo models.UserInfo, err error) {

	// 解析jwt
	jClaims, err := tool.ParseToken(token)
	if err != nil {
		return userInfo, errors.OtherError("token异常")
	}

	// 判断是否有某个权限
	fount := false
	for _, v := range jClaims.Scope {
		if v == "userinfo" {
			fount = true
		}
	}
	if !fount {
		return userInfo, errors.OtherError("权限不支持")
	}

	// 查询用户
	_, userName, _, nick, pic, _, _, err := s.st.SelUser(jClaims.Subject)
	if err != nil {
		return userInfo, errors.OtherError("用户查询失败")
	}

	// 设置弄好的
	userInfo.Username = userName
	userInfo.Nickname = nick
	userInfo.Picture = pic
	return userInfo, nil
}
